package com.lhq.lambda;

import org.junit.Test;

import java.util.Comparator;
import java.util.TreeSet;
import java.util.function.BinaryOperator;
import java.util.function.Consumer;

/**
 * Lambda表达式是一个匿名函数
 * （是一段可传递的代码）
 * lambda表达式的语法
 * 操作符为‘->’又称箭头操作符
 * 左侧：指定了 Lambda 表达式需要的所有参数
 * 右侧：指定了 Lambda 体，即 Lambda 表达式要执行的功能
 * 语法格式一：
 * 无参，无返回值，Lambda 体只需一条语句
 *   Runnable r2 =()-> System.out.println("hello world!lambda1");
 * 语法格式二：
 * Lambda 需要一个参数
 * Consumer<String> fun=(arg)-> System.out.println(arg);
 * 语法格式三：
 * Lambda 只需要一个参数时，参数的小括号可以省略()
 * Consumer<String> fun=arg-> System.out.println(arg);
 * 语法格式四：
 * Lambda 需要两个参数，并且有返回值
 * BinaryOperator<Long> bo=(x,y)->{
 *             System.out.println("实现函数接口"+x+y);
 *             return x+y;
 *         };
 *语法格式五：
 * 当 Lambda 体只有一条语句时，return 与大括号可以省略
 *BinaryOperator<Integer> bo=(x,y)->x+y;
 * 语法格式六：
 * 数据类型可以省
 * 略，因为可由编
 * 译器推断得出，
 * 称为“类型推断”
 */

public class TestLambda {
    @Test
    public  void test5() {
        BinaryOperator<Integer> bo=(x,y)->x+y;

        bo.apply(1,2);
    }
    @Test
    public  void test4() {
        BinaryOperator<Long> bo=(x,y)->{
            System.out.println("实现函数接口"+x+y);
            return x+y;
        };

        bo.apply(1l,2L);
    }
    @Test
    public  void test3() {
        Consumer<String> fun=(arg)-> System.out.println(arg);
        fun.accept("jkqdgkew");
    }

    @Test
    public  void test1() {
        Runnable r1=new Runnable() {
            public void run() {
                System.out.println("hello world!");
            }
        };
        r1.run();
    }
    @Test
    public void test_lambda(){

        Runnable r2 =()-> System.out.println("hello world!lambda1");
        r2.run();
    }

    @Test
    public void test2(){
        TreeSet<String> ts1=new TreeSet<>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return Integer.compare(o1.length(),o2.length());
            }
        });
    }


    //lambda表达式作为参数传递
    @Test
    public void test2Lambda(){
        TreeSet<String> ts1=new TreeSet<>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return Integer.compare(o1.length(),o2.length());
            }
        });
        ts1.comparator().compare("hdww","dhewwfe");
    }

    @Test
    public void test2Lambda2(){

    }

}
